Sé que esta pregunta al principio parece que ya se ha abordado en SO varias veces. Pero me enfrento a este problema a pesar de todas las otras preguntas y respuestas.
Específicamente, sé que se requieren esas 2 cosas (de otras respuestas):
true cuando es asyncsendMessage siempre debe usarse si se espera (incluso solo para resolver true )No pude encontrar ninguna otra trampa que hiciera fallar lo siguiente:
// content_script.js const sendMessageToBackground = (payload) => new Promise((resolve) => { chrome.runtime.sendMessage(payload, (response) => { resolve(response); }); }); const request = { type: "papersWithCode" }; const backgroundResponse = await sendMessageToBackground(request); // triggers error console.log(backgroundResponse) // undefined // background.js const dummy = async () => { const html = await fetch("https://stackoverflow.com/"); return 42; }; chrome.runtime.onMessage.addListener(async (payload, sender, sendResponse) => { if (payload.type === "papersWithCode") { const dum = await dummy(); console.log("dum: ", dum); // 42 sendResponse({ success: true, dum }); return true; } }); El problema parece surgir de la naturaleza async de dummy() porque si cambio a lo siguiente, todo funciona:
// background.js const dummy = () => 42 chrome.runtime.onMessage.addListener(async (payload, sender, sendResponse) => { if (payload.type === "papersWithCode") { const dum = dummy(); console.log("dum: ", dum); // 42 sendResponse({ success: true, dum }); return true; } });